package com.thd.framework.camunda.service;



import com.thd.framework.camunda.entity.ProcessInstanceEntity;
import com.thd.framework.camunda.entity.ProcessInstanceTaskEntity;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * com.thd.springboottest.camunda.service.WorkFlowService
 *
 * @author: wanglei62
 * @DATE: 2022/5/29 15:23
 **/
public interface WorkFlowService {
    /**
     * 通过classpath部署流程
     * @param bpmnPath bpmn的classpath路径(不要加根/)
     * @return deployID 部署ID
     */
    public String deploy(String bpmnPath);

    /**
     * 通过输入流部署流程
     * @param is bpmn的InputStream
     * @param bpmnFileName bpmn的名字(用于保存到数据库bpmn的名称)
     * @return deployID 部署ID
     */
    public String deploy(InputStream is,String bpmnFileName);

    /**
     * 同构bpmn的文本内容部署流程
     * @param bpmnContent
     * @param bpmnFileName
     * @return
     */
    public String deploy(String bpmnContent ,String bpmnFileName);
    /**
     * 根据部署ID删除部署(仅仅删除部署)
     * @param deploymentId 流程部署ID
     */
    public void deleteDeploy(String deploymentId);
    /**
     * 根据部署ID删除部署流程以及对应的流程定义和流程实例
     * @param deploymentId 流程部署ID
     */
    public void deleteDeployCascade(String deploymentId);

    /**
     * 根据流程定义ID删除流程定义(只删除流程定义)
     * @param procDefId
     */
    public void deleteProcessDefinition(String procDefId);
    /**
     * 根据流程定义ID删除流程定义和流程实例
     * @param procDefId
     */
    public void deleteProcessDefinitionCascade(String procDefId);

    /**
     * 开启流程
     * @param processKey 流程key
     * @param businessKey 业务key
     * @param var 流程变量
     * @return
     */
    public ProcessInstanceEntity startProcess(String processKey, String businessKey, Map var);

    /**
     * 取消工作流
     * @param businessKey 业务主键
     * @param reason 取消原因
     */
    public void cancelProcess(String businessKey,String reason);


    /**
     * 设置流程实例的流程变量
     * @param processInstanceId 流程实例ID
     * @param var 流程变量
     */
    public void addVariableForProcessInstance(String processInstanceId,Map var);
    /**
     * 设置流程实例的流程变量
     * @param businessKey 业务主键
     * @param var 流程变量
     */
    public void addVariableForProcessInstanceByBusinessKey(String businessKey,Map var);
    /**
     * 设置执行实例的本地流程变量
     * @param executionId 执行实例
     * @param var 流程变量
     */
    public void addVariableForExecutionLocal(String executionId,Map var);
    /**
     * 设置执行实例的变量
     * @param executionId 执行实例
     * @param var 流程变量
     */
    public void addVariableForExecution(String executionId,Map var);
    /**
     * 设置待办的流程变量
     * @param taskId 待办ID
     * @param var 流程变量
     */
    public void addVariableForTask(String taskId,Map var);
    /**
     * 设置待办的本地流程变量
     * @param taskId 待办ID
     * @param var 流程变量
     */
    public void addVariableForTaskLocal(String taskId,Map var);

    /**
     * 查询流程实例的流程变量
     * @param processInstanceId 流程实例ID
     * @return
     */
    public Map queryVariableForProcessInstance(String processInstanceId);

    /**
     * 查询流程实例的流程变量
     * @param businessKey 业务主键
     * @return
     */
    public Map queryVariableForProcessInstanceByBusinessKey(String businessKey);
    /**
     * 查询执行实例的流程变量
     * @param executionId 执行实例ID
     * @return
     */
    public Map queryVariableForExecution(String executionId);
    /**
     * 查询执行实例的本地流程变量
     * @param executionId 执行实例ID
     * @return
     */
    public Map queryVariableForExecutionLocal(String executionId);
    /**
     * 查询待办的流程变量
     * @param taskId 待办ID
     * @return
     */
    public Map queryVariableForTask(String taskId);
    /**
     * 查询待办的本地流程变量
     * @param taskId 待办ID
     * @return
     */
    public Map queryVariableForTaskLocal(String taskId);

    /**
     * 根据taskId查询候选人
     * @param taskId 待办ID
     * @return
     */
    public List<String> queryCandidateForTask(String taskId);

    /**
     * 根据taskId查询代办人
     * @param taskId 待办ID
     * @return
     */
    public String queryAssigneeForTask(String taskId);

    /**
     * 根据候选人查询待办
     * @param candidate 候选人
     * @return
     */
    public List<ProcessInstanceTaskEntity> queryTaskForCandidate(String candidate);

    /**
     * 根据代办人查询待办
     * @param assignee 代办人
     * @return
     */
    public List<ProcessInstanceTaskEntity> queryTaskForAssignee(String assignee);

    /**
     * 判断某个代办的候选人和待办人是否包含某人
     * @param taskId 待办ID
     * @param userId 人员ID
     * @return
     */
    public boolean isCandidateOrAssigneeForTask(String taskId,String userId);

    /**
     * 根据人员ID查询待办(包括候选人或代办人)
     * @param userId 代办人或候选人
     * @return
     */
    public List<ProcessInstanceTaskEntity> queryTaskForUser(String userId);

    /**
     * 查询某个流程实例的代办
     * @param processInstanceId 流程实例ID
     * @return
     */
    public List<ProcessInstanceTaskEntity> queryTaskByProcessInstanceId(String processInstanceId);

    /**
     * 查询某个流程实例的代办
     * @param businessKey 业务主键
     * @return
     */
    public List<ProcessInstanceTaskEntity> queryTaskByBusinessKey(String businessKey);

    /**
     * 查询某个代办信息
     * @param taskId 代办ID
     * @return
     */
    public ProcessInstanceTaskEntity queryTaskByTaskId(String taskId);

    /**
     * 完成代办
     * @param taskId 待办ID
     * @param variableMap 流程变量
     */
    public void completeTask(String taskId, Map<String, Object> variableMap);

    /**
     * 完成代办并设置该待办完成时的代办人
     * @param assignee
     * @param taskId 待办ID
     * @param variableMap 流程变量
     */
    public void completeTaskWithAssignee(String assignee,String taskId, Map<String, Object> variableMap);

    /**
     * 候选人签收待办
     * @param taskId 待办ID
     * @param candidate 候选人
     */
    public void claimTask(String taskId, String candidate);

    /**
     * 签收并完成任务
     * @param taskId 待办ID
     * @param userId 用户ID
     * @param variableMap 流程变量
     */
    public void claimAndComplateTask(String taskId, String userId,Map<String, Object> variableMap);

    /**
     * 指派任务的代办人(如果删除则assignee设置为null)
     * @param taskId 任务ID
     * @param assignee 待办人
     */
    public void assignAssigneeForTask(String taskId,String assignee);
    /**
     * 给待办添加候选人
     * @param taskId 任务ID
     * @param candidate 候选人
     */
    public void addCandidateUserToTask(String taskId, String candidate);

    /**
     * 给待办添加候选人(批量)
     * @param taskId 任务ID
     * @param candidates 候选人列表
     */
    public void addCadidatesForTask(String taskId,List<String> candidates);

    /**
     * 移除某个任务的候选人
     * @param taskId 任务ID
     * @param candidate 候选人
     */
    public void removeCandidateForTask(String taskId,String candidate);

    /**
     * 移除某个任务的候选人(批量)
     * @param taskId 任务ID
     * @param candidates 候选人列表
     */
    public void removeCandidatesForTask(String taskId,List<String> candidates);

    /**
     * 替换待办的候选人
     * @param taskId 任务ID
     * @param oldCandidate 被替换的候选人
     * @param newCandidate 替换为的候选人
     */
    public void replaceCandidateUserFromTask(String taskId, String oldCandidate,String newCandidate);

    /**
     * 根据流程定义ID获取所有节点
     * @param procDefId 流程定义ID
     */
    public void getAllElement(String procDefId);

    /**
     * 判断流程实例是否关闭
     * @param processInstanceId 流程实例ID
     * @return true:已关闭 false:未关闭
     */
    public boolean isEndedByProcessInstanceId(String processInstanceId);
    /**
     * 根据业务主键判断流程实例是否关闭
     * @param bussinessKey 业务主键
     * @return true:已关闭 false:未关闭
     */
    public boolean isEndedByBussinessKey(String bussinessKey);

    /**
     * 根据taskID查询业务主键
     * @param taskId 待办ID
     * @return 业务主键
     */
    public String queryBusinessKeyByTaskId(String taskId);

    /**
     * 将camunda的task转换成 ProcessInstanceTaskEntity
     * @param task
     * @return
     */
    public ProcessInstanceTaskEntity transferTask(org.camunda.bpm.engine.task.Task task);

    /**
     * 自由流
     * @param processInstanceId 流程实例ID
     * @param targetActivityId 目标节点id (流程定义xml中元素的id)
     */
    public void jump(String processInstanceId,String targetActivityId);
}
